package com.tdam2012.grupo04;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.TimeZone;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.ContactsContract;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.tdam2012.grupo04.data.ActividadesProvider;
import com.tdam2012.grupo04.data.MensajesProvider;
import com.tdam2012.grupo04.data.UsuariosProvider;
import com.tdam2012.grupo04.messageWeb.MessageWeb;
import com.tdam2012.grupo04.messageWeb.ServerConnection;

public class ChatListActivity extends ListActivity implements OnClickListener, OnItemClickListener {
	
	
	private Contact contacto;
	private MessageWebAdapter _adapter;
    private TextView txtMensaje;
    private Button btnEnviar;
    private String user;
    private MessageWeb message;
    private NotificationManager mNotificationManager;
	private Notification notification;
	private ArrayList<MessageWeb> _messages;
	private static final String USUARIO = "usuario";
	private static final String USUARIOWEB = "usuarioWeb";
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat_list);
        _adapter = new MessageWebAdapter();
        _messages= new ArrayList<MessageWeb>();
		getListView().setAdapter(_adapter); 
		getListView().setOnItemClickListener(this);
		
		loadData();
		
		txtMensaje = (TextView) findViewById(R.id.txtMensaje);
		btnEnviar = (Button) findViewById(R.id.btnEnviar);
		cargarMensajes();
		
		getListView().setStackFromBottom(true);
		
		String ns=Context.NOTIFICATION_SERVICE;
        mNotificationManager = (NotificationManager) getSystemService(ns);
		
		btnEnviar.setOnClickListener(this);
		registerForContextMenu(getListView());
    }
    
    private void registroMensajes(String mens, String usuarioLocal, String estadoMensaje, String estadoActividad, String usuarioRemoto, String leido){
    	Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT-03:00")); 
		SimpleDateFormat postFormater = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss" ); 

		
		//Registro mensaje de texto
		ContentValues cv1 = new ContentValues();				
		cv1.put(MensajesProvider.COL_TEXTO, mens);
		cv1.put(MensajesProvider.COL_FECHA,  postFormater.format(c.getTime()));
		cv1.put(MensajesProvider.COL_ESTADO,  estadoMensaje);
		cv1.put(MensajesProvider.COL_USUARIOLOCAL, usuarioLocal);
		cv1.put(MensajesProvider.COL_USUARIOREMOTO, usuarioRemoto);
		cv1.put(MensajesProvider.COL_LEIDO, leido);

		getContentResolver().insert(MensajesProvider.CONTENT_URI, cv1);

		//Registro accion mensaje
		ContentValues cv2 = new ContentValues();				
		cv2.put(ActividadesProvider.COL_TIPO, estadoActividad);
		cv2.put(ActividadesProvider.COL_ID, contacto.get_id());
		cv2.put(ActividadesProvider.COL_FECHA, postFormater.format(c.getTime()));


		getContentResolver().insert(ActividadesProvider.CONTENT_URI, cv2);
    }
    
    private void actualizar(){
    	_adapter.clear();
		cargarMensajes();
		getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
		getListView().setStackFromBottom(true);
    }
    
    private boolean verificarConexion(){
    	Context context = getApplicationContext();
		ConnectivityManager connectMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		if (connectMgr != null) {
			NetworkInfo[] netInfo = connectMgr.getAllNetworkInfo();
			if (netInfo != null) {
				for (NetworkInfo net : netInfo) {
					if (net.getState() == NetworkInfo.State.CONNECTED) {
						return true;
					}
				}
			}
		} 
		return false;
    }
    
    public void loadData()
    {
    	contacto = (Contact) getIntent().getSerializableExtra(LoginActivity.KEY_CONTACT);
    	user = (String) getIntent().getSerializableExtra(LoginActivity.USER);
    	
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	   getMenuInflater().inflate(R.menu.activity_chat_list, menu);
           menu.getItem(0).setIcon(android.R.drawable.ic_menu_set_as);
           menu.getItem(1).setIcon(android.R.drawable.ic_menu_preferences);
           return true;
       }
    
    public boolean onOptionsItemSelected(MenuItem item)
	{
    	Intent i;
    	switch (item.getItemId()) {
			case R.id.itemMenuConectividadWebLogin:
				i = new Intent(this, ConectividadListActivity.class);
				startActivity(i);
			case R.id.itemMenuPreferences:
				i = new Intent(this, ChatListPreferences.class);
				startActivity(i);
			default:
				break;
		}
		
		return super.onOptionsItemSelected(item);
	}
    //Registro nuevo usuario asociado al contacto seleccionado de la lista contactos.
    public Boolean registrarUsuarioContacto(String idContacto, String usuarioRemoto){
    	try {
    		ContentValues cv1 = new ContentValues();				
    		cv1.put(UsuariosProvider.COL_IDCONTACTO, idContacto);
    		cv1.put(UsuariosProvider.COL_USUARIOREMOTO, usuarioRemoto);
    		getContentResolver().insert(UsuariosProvider.CONTENT_URI, cv1);

    		return true;
		} catch (Exception e) {
			return false;
		}
    }
    
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
    {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = getMenuInflater();
        menu.setHeaderTitle(getString(R.string.ChatListActivity_accionesDisponibles));
        inflater.inflate(R.menu.menu_ctx_chatlist,menu);
    }
    
    @Override
    public boolean onContextItemSelected(MenuItem item) {   
    	
    	AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
    	switch (item.getItemId()) {
    		
    		case R.id.Opc1MenuContextualChatListActivity:
            	 String codMensaje = _adapter.get_messages().get(info.position).getCodigo();
            	 if(eliminarMensaje(codMensaje)==1){
            		 Toast.makeText(ChatListActivity.this, getString(R.string.ChatListActivity_borradoExitoso), Toast.LENGTH_LONG).show();
            		 _adapter.get_messages().clear();
            		 cargarMensajes();
            		 
            		 _adapter.notifyDataSetChanged();
            	 }
            	 else	 
            	 {
            		 Toast.makeText(ChatListActivity.this, getString(R.string.ChatListActivity_borradoNoExitoso), Toast.LENGTH_LONG).show();
            	 }
            	return true;
                
            default:
                return super.onContextItemSelected(item);
    		}
    	
     }
    
    private int eliminarMensaje(String idMensaje){
    	try {
    	ContentResolver cr = getContentResolver();
    	return cr.delete(MensajesProvider.CONTENT_URI, idMensaje, null);
    	} catch (Exception e) {
    	return 0;
    	}
    }
    
    public String buscarUsuarioContacto(String idContacto){
    	String nombreUsuarioRemoto="";
    	ContentResolver cr = getContentResolver();
    	String[] condiciones = new String[] {idContacto, ""};
		Cursor cursor = cr.query(UsuariosProvider.CONTENT_URI, null, null, condiciones, null);
		if (cursor.getCount()>0){
			while (cursor.moveToNext()) {
				nombreUsuarioRemoto=cursor.getString(2).toString();
			}
		}
		cursor.close();
		return nombreUsuarioRemoto;
    }
    
    private String getContactName(String idContacto) {
    	ContentResolver cr = getContentResolver();
    	String nombreContacto ="";
		Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, null);
		if (cursor.getCount() > 0) {
			while (cursor.moveToNext()) {
				String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
				if(id.compareTo(idContacto)==0){
					nombreContacto = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
				}
			}
		}
		cursor.close();
		return nombreContacto;
	}
    
    private String getContactId(String user) {
    	String nombre="";
    	ContentResolver cr = getContentResolver();
    	String[] condiciones = new String[] {"", user};
		Cursor cursor = cr.query(UsuariosProvider.CONTENT_URI, null, null, condiciones, null);
		if (cursor.getCount()>0){
			while (cursor.moveToNext()) {
				nombre=cursor.getString(1).toString();
			}
		}
		cursor.close();
		return nombre;
	}
    
    private void cargarMensajes() {
        
    	ContentResolver cr = getContentResolver();
    	String usuarioRemotoWeb= buscarUsuarioContacto(contacto.get_id());
    	SharedPreferences preferences = getSharedPreferences(USUARIOWEB, MODE_PRIVATE);
    	String usuarioLocalWeb = preferences.getString(USUARIO, "");
    	String[] condiciones = new String[] {usuarioRemotoWeb, usuarioLocalWeb, ""};
    	
		Cursor cursor = cr.query(MensajesProvider.CONTENT_URI, null, null, condiciones, null);

		if (cursor.getCount() > 0) {
			while (cursor.moveToNext()) {
				String codigo= cursor.getString(0);
				String usuarioLocal= cursor.getString(4);
				String usuarioRemoto= cursor.getString(1);
				String mensaje= cursor.getString(6);
				String fecha= cursor.getString(2);
				String leido= cursor.getString(5);
				String estado= cursor.getString(3);
				String estadoConversacion = "";
				String contactNameRemoto="";
				if(usuarioLocalWeb.compareTo(usuarioLocal)==0){
					estadoConversacion = estado;
					contactNameRemoto=getContactName(getContactId(usuarioLocalWeb));
				}
				else{
					estadoConversacion = getString(R.string.ChatListActivity_estadoConversacionRecibido);
					contactNameRemoto=getContactName(getContactId(usuarioRemotoWeb));
				}
				message = new MessageWeb(codigo,usuarioLocal, usuarioRemoto, contactNameRemoto, mensaje, fecha, leido, estadoConversacion);
				_messages.add(message);
				
				//_adapter.addMensaje(message);
			}
		}
		cursor.close();
    	
    	_adapter.notifyDataSetChanged();
			
	}
    
    private int ultimoCodigo() {
    	ContentResolver cr = getContentResolver();
    	String[] condiciones = new String[] {"", "", ""};
		Cursor cursor = cr.query(MensajesProvider.CONTENT_URI, null, null, condiciones, null);
		String codigo;
		if (cursor.getCount() > 0) {
			cursor.moveToLast(); 
			codigo= cursor.getString(0);			
		}else{
			codigo = "0";
		}
		cursor.close();
		int cod=Integer.parseInt(codigo)+1;
		return cod;
    }
    
    private void sendNotification(String _tickerText, String _title, String _text){
		notification = new Notification(android.R.drawable.ic_menu_send, _tickerText, System.currentTimeMillis());
		Intent intent = new Intent();
    	PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);
    	notification.setLatestEventInfo(getApplicationContext(), _title, _text, contentIntent);
    	notification.flags = Notification.FLAG_AUTO_CANCEL;
    	mNotificationManager.notify(1, notification);
	}
    
    @Override
    protected void onResume() {
    	// TODO Auto-generated method stub
    	super.onResume();
    	_adapter.setMessagesAdapter(_adapter.filterMessages(loadCriterPreferences()));
    	_adapter.notifyDataSetChanged();
    }
    
    public String loadCriterPreferences()
    {
    	SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
    	String criterioFiltro = pref.getString("filtrosMensajes", "");
    	return criterioFiltro;
    }
    
    class Holder {
    	TextView contacto;
		TextView texto;
		ImageView imagen;
		TextView info;

	}
	
	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
		
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.btnEnviar:
			if(txtMensaje.getText().toString().length() == 0){
				Toast.makeText(ChatListActivity.this, getString(R.string.ChatListActivity_escribaMensaje), Toast.LENGTH_LONG).show();
				break;
			}
			if(verificarConexion()){
				ThreadSender thread = new ThreadSender();
				thread.execute();
				break;
			}else{
				String usuarioRemotoWeb=buscarUsuarioContacto(contacto.get_id());
				registroMensajes(txtMensaje.getText().toString(), user, getString(R.string.ChatListActivity_mensajeNoEnviado), getString(R.string.ChatListActivity_mensajeWebNoEnviado), usuarioRemotoWeb, "1");
				sendNotification(getString(R.string.ChatListActivity_mensajeWebNoEnviado), getString(R.string.MessageWebService_notTitle), getString(R.string.mail_Error));
				showDialog(1);				
				actualizar();
	    		txtMensaje.setText("");
				break;
			}
		default:
			break;
			}			
		}
	
	
	class ThreadSender extends AsyncTask<Void, Void, Boolean> {
    	
    	@Override
    	protected Boolean doInBackground(Void... params) {
    		boolean resultado;
    		ServerConnection connection = new ServerConnection();
    		String usuarioRemotoWeb= buscarUsuarioContacto(contacto.get_id());
    		String codigoMensaje = Integer.toString(ultimoCodigo());
			try{
				if(connection.parseSend(user, usuarioRemotoWeb, codigoMensaje+"."+txtMensaje.getText().toString())){
					try {
						
						SharedPreferences shPrefere=getSharedPreferences(USUARIOWEB, MODE_PRIVATE);
						String user=shPrefere.getString(USUARIO, "");
														
						
						registroMensajes(txtMensaje.getText().toString(), user, getString(R.string.ChatListActivity_mensajeEnviado), getString(R.string.ChatListActivity_mensajeWebEnviado), usuarioRemotoWeb, "0");
						resultado = true;
						
					} catch (Exception e) {
						registroMensajes(txtMensaje.getText().toString(), user, getString(R.string.ChatListActivity_mensajeNoEnviado), getString(R.string.ChatListActivity_mensajeWebNoEnviado), usuarioRemotoWeb, "1");
						runOnUiThread(new Runnable() { public void run() {showDialog(3);}}); //Permite correr un AlertDialog dentro de un Thread 
						resultado = false;
					}
				}else{
					registroMensajes(txtMensaje.getText().toString(), user, getString(R.string.ChatListActivity_mensajeNoEnviado), getString(R.string.ChatListActivity_mensajeWebNoEnviado), usuarioRemotoWeb, "1");
					runOnUiThread(new Runnable() { public void run() {showDialog(2);}}); //Permite correr un AlertDialog dentro de un Thread
					resultado = false;
				}
			}catch (Exception e) {
				registroMensajes(txtMensaje.getText().toString(), user, getString(R.string.ChatListActivity_mensajeNoEnviado), getString(R.string.ChatListActivity_mensajeWebNoEnviado), usuarioRemotoWeb, "1");
				runOnUiThread(new Runnable() { public void run() {showDialog(3);}}); //Permite correr un AlertDialog dentro de un Thread
				resultado = false;
			}
			return resultado;
    	}
    	
    	@Override
    	protected void onPostExecute(Boolean result) {
    		super.onPostExecute(result);
    		if(result){
    			sendNotification(getString(R.string.ChatListActivity_mensajeWebEnviadoCorrectamente), getString(R.string.MessageWebService_notTitle), getString(R.string.ChatListActivity_mensajeWebEnviadoCorrecto));
    		}else{
    			sendNotification(getString(R.string.ChatListActivity_mensajeWebNoEnviado), getString(R.string.MessageWebService_notTitle), getString(R.string.mail_Error));
    		}
    		actualizar();
    		txtMensaje.setText("");
    	}
    
    }
	
	@Override
	public Dialog onCreateDialog(int id){
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Mensaje web no enviado");
		switch(id){
			case 1:
				builder.setMessage(getString(R.string.ChatListActivity_mensajeWebNoPudoEnviado)+" "+getString(R.string.ChatListActivity_mensajeWebNoPudoEnviadoVerCon));	
				break;
			case 2:
				builder.setMessage(getString(R.string.ChatListActivity_mensajeWebNoPudoEnviado)+" "+getString(R.string.ChatListActivity_mensajeWebNoPudoEnviadoVerSer));	
				break;
			case 3:
				builder.setMessage(getString(R.string.ChatListActivity_mensajeWebNoPudoEnviado)+" "+getString(R.string.ChatListActivity_mensajeWebNoPudoEnviadoExcp));	
				break;
			default:
				builder.setMessage(getString(R.string.ChatListActivity_mensajeWebNoPudoEnviado));
				break;
		}
	
		builder.setPositiveButton(getString(R.string.login_aceptar), new DialogInterface.OnClickListener() {		
		
			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.cancel();
			}
		});
	
		AlertDialog alert = builder.create();
		return alert;
	}
	
	class MessageWebAdapter extends BaseAdapter{
		
		private ArrayList<MessageWeb> _messagesAdapter; 
		private LayoutInflater _inflater;
		

		public MessageWebAdapter() { 
			_messagesAdapter = new ArrayList<MessageWeb>(); 
			_inflater = LayoutInflater.from(ChatListActivity.this);
		}
		
		private ArrayList<MessageWeb> get_messages() {
			return _messagesAdapter;
		}
		
		
		public void setMessagesAdapter(ArrayList<MessageWeb> messages) {
			this._messagesAdapter = messages;
		}
		
		public ArrayList<MessageWeb> filterMessages(String criterio)
		{
			MessageWeb m;
			ArrayList<MessageWeb> listafiltrada = new ArrayList<MessageWeb>();
			Iterator<MessageWeb> i = _messages.iterator();
			SharedPreferences preferences = getSharedPreferences(USUARIOWEB, MODE_PRIVATE);
		    String usuarioLocalWeb = preferences.getString(USUARIO, "");
			
			if(criterio.equalsIgnoreCase("SIN")){
				listafiltrada = _messages;
				return listafiltrada;
			}
			if(criterio.equalsIgnoreCase("ENV")){
				
				while(i.hasNext())
				{
					 m = (MessageWeb) i.next();
					 if(usuarioLocalWeb.compareTo(m.getUsuarioLocal())==0){ //Mensaje enviado
						listafiltrada.add(m);	
					 }
				}
			}
			if(criterio.equalsIgnoreCase("REC"))
			{
				while(i.hasNext())
				{
					m = (MessageWeb) i.next();
					if(usuarioLocalWeb.compareTo(m.getUsuarioLocal())!=0){
						 listafiltrada.add(m);
					 }
				}
				
			}
			if(criterio.equalsIgnoreCase("NOENV"))
			{
				while(i.hasNext())
				{
					m = (MessageWeb) i.next();
					if(m.getEstado().equalsIgnoreCase("No Enviado")){
						 listafiltrada.add(m);
					 }
				}
				
			}
			return listafiltrada;
			
		}
		
		public void addMensaje(MessageWeb message)
		{
			_messagesAdapter.add(message);
		}
		
		public void clear(){
			_messagesAdapter.clear();
		}

		public MessageWeb getMessage(int position) {
			MessageWeb message= (MessageWeb) getItem(position);
			return message;
		}
		
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return _messagesAdapter.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return _messagesAdapter.get(position);
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position ;
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			Holder holder = null;
			if (convertView == null) {
				convertView = _inflater.inflate(R.layout.attr_item, null); 
				holder = new Holder();  
				holder.texto = (TextView) convertView.findViewById(R.id.txtDato);
				holder.contacto = (TextView) convertView.findViewById(R.id.txtTitulo);
				holder.imagen = (ImageView) convertView.findViewById(R.id.imagen);
				holder.info=(TextView)convertView.findViewById(R.id.txtInformacion);
				convertView.setTag(holder);
			} else {
				holder = (Holder) convertView.getTag(); 
			}
			MessageWeb message = _messagesAdapter.get(position);
			SharedPreferences preferences = getSharedPreferences(USUARIOWEB, MODE_PRIVATE);
	    	String usuarioLocalWeb = preferences.getString(USUARIO, "");
	    	String _contacto = message.getUsuarioLocal();
			if(_contacto.compareTo(usuarioLocalWeb)==0 || _contacto.compareTo("")==0){
				_contacto = getString(R.string.ChatListActivity_yoDigo);
			}else{
				_contacto = message.getContactNameRemoto()+" "+getString(R.string.ChatListActivity_dice);
			}
			String _texto = message.getMensaje();
			String estado=message.getEstado();
			String fecha=message.getFecha();
			
            holder.texto.setText(_texto);
			holder.contacto.setText(_contacto);
			holder.info.setText(estado+": "+fecha);
			
			return convertView; 
					
		}
			
	
    }
	
}

